package tcc.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

public class DataBaseCreator {
	// TODO classe que automatiza isso! (trabalhos futuros)

	// TODO remover o bloco abaixo
	/*
	 * Connection conn = null; String url = "jdbc:mysql://localhost:3306/";
	 * String dbName = "promoweb"; String driver = "com.mysql.jdbc.Driver";
	 * String userName = "root"; String password = "mysql";
	 */

	// logar como root:
	// mysql -u root -p
	// senha: mysql

	// para criar um banco de dados faca:
	// create database promoweb CHARACTER SET utf8 COLLATE utf8_general_ci;

	// deletar banco
	// drop database promoweb;

	// Emma (ubuntu gui for view database)

	public DataBaseCreator() {

		// TODO remover o bloco abaixo
		/*
		 * try { Class.forName(driver); conn = DriverManager .getConnection(url
		 * + dbName, userName, password); } catch (Exception e) {
		 * System.out.println("Banco de dados não existe!");
		 * System.out.println("crie um banco de dados: \"promoweb\""); }
		 */

		try {
			// Statement statement = conn.createStatement(); TODO remover essa
			// linha
			Statement statement = DBSingleton.getStatement();

			CriaTabelas(statement);
			PopulaDados(statement);

			// conn.close(); TODO remover essa linha
			statement.close();

		} catch (Exception e) {
			// tabelas já existem
			System.out
					.println("As tabelas já existem no banco de dados, ou a inserção dos dados não foi efetuada. A criação e população do bancos de dados será ignorada.");
		}

	}

	private void CriaTabelas(Statement statement) throws SQLException {

		LinkedList<String> comandosSQL = new LinkedList<String>();

		// foto
		comandosSQL.add("create table foto("
				+ " id_foto integer primary key not null AUTO_INCREMENT,"
				+ " foto blob"//
				+ ");"//
		);

		// endereço
		comandosSQL.add("create table endereco("
				+ " id_endereco integer primary key not null AUTO_INCREMENT,"
				+ " cep varchar(10)," //
				+ " pais varchar(50),"//
				+ " estado varchar(2)," //
				+ " cidade varchar(50),"//
				+ " bairro varchar(50)," //
				+ " rua varchar(50),"//
				+ " numero varchar(20)," //
				+ " complemento varchar(50),"//
				+ " posX real," //
				+ " posY real"//
				+ ");"//
		);

		// usuario
		comandosSQL
				.add("create table  usuario("
						+ " id_usuario integer primary key not null AUTO_INCREMENT,"//
						+ " nome varchar(100), "//
						+ " email varchar(100),"//
						+ " nick varchar(50),"//
						+ " senhaMD5 varchar(32),"//
						+ " data_nasc date,"//
						+ " sexo TINYINT(1),"//
						+ " id_facebook varchar(100),"//
						+ " id_endereco integer,"//
						+ " id_foto integer,"//
						+ " foreign key (id_endereco) references endereco(id_endereco) ,"//
						+ " foreign key (id_foto) references foto(id_foto) "//
						+ ");"//
				);

		// Empresario
		comandosSQL
				.add("create table empresario(\n"//
						+ " id_empresario integer primary key not null AUTO_INCREMENT,\n"//
						+ " CNPJ_matriz varchar(20),\n"//
						+ " id_foto integer,\n"
						+ " id_usuario integer,\n"
						+ " foreign key (id_foto) references foto(id_foto),\n"//
						+ " foreign key (id_usuario) references usuario(id_usuario)"//
						+ " );"//
				);

		// Empresa
		comandosSQL
				.add("create table empresa("//
						+ " id_empresa integer primary key not null AUTO_INCREMENT,"//
						+ " nome_fantasia varchar(100),"//
						+ " CNPJ varchar(20),"//
						+ " email varchar(100),"//
						+ " telefone varchar(20),"//
						+ " site varchar(70),"//
						+ " id_foto integer,"//
						+ " id_empresario integer,"
						+ " foreign key (id_foto) references foto(id_foto),"//
						+ " foreign key (id_empresario) references empresario(id_empresario)"//
						+ " );"//
				);

		// promocao
		comandosSQL.add("create table promocao("//
				+ " id_promocao integer primary key not null AUTO_INCREMENT,\n"//
				+ " titulo varchar(50),\n"//
				+ " descricao varchar(400),\n"//
				+ " ativo TINYINT(1),\n"// boolean
				+ " id_foto integer,\n"//
				+ " foreign key (id_foto) references foto(id_foto), \n"//
				+ " id_empresa integer,\n"//
				+ " foreign key (id_empresa) references empresa(id_empresa) "//
				+ " );"//
		);

		System.out.println("Criando tabelas no banco de dados");
		for (String sql : comandosSQL) {
			try {
				statement.execute(sql);
			} catch (SQLException e) {
				System.out.println("Erro na execução de criação de tabela:");
				System.out.println(sql);
				// e.printStackTrace();
				throw new SQLException("Não foi possível criar tabela", e);
			}
		}
		System.out.println("Tabelas criadas.");

	}

	private void PopulaDados(Statement statement) throws SQLException {

		LinkedList<String> comandosSQL = new LinkedList<String>();

		// endereco
		comandosSQL.add("insert into endereco"//
				+ " (pais)"//
				+ " values"//
				+ " ('Brasil');"//
		);
		// foto
		comandosSQL.add("insert into foto"//
				+ " (foto)"//
				+ " values"//
				+ " (null);"//
		);

		// usuario
		comandosSQL
				.add("insert into usuario"//
						+ " (email, nome, nick, senhaMD5, sexo, id_foto, id_facebook, id_endereco)"//
						+ " values" //
						+ " ('admin@admin.com', 'Administrador', 'admin', '21232f297a57a5a743894a0e4a801fc3', '1', 1, null,1),"//
						+ " ('marciel@gmail.com', 'Marciel', 'marciel', 'df6d1818a2cd3212f4bbf00ada1154e7', '1', 1, null,1),"//
						+ " ('juliao@gmail.com', 'Ricardo Julião', 'Julião', '9d57d58ce8bc90d5e3f6806609187df7', '1', 1, null,1);"//
				);

		System.out.println("Populando banco de dados.");
		for (String sql : comandosSQL) {
			try {
				statement.execute(sql);
			} catch (SQLException e) {
				System.out
						.println("Não foi possivel popular o banco de dados usando o comando a seguir:");
				System.out.println(sql);
				// e.printStackTrace();
				throw new SQLException(
						"nao foi possível adicionar dados ao banco de dados", e);
			}
		}
		System.out.println("Banco de dados populado.");

	}
}